package pers.xiaojun.boot.module.system.dao.redis.oauth2;

import cn.hutool.core.util.StrUtil;
import lombok.RequiredArgsConstructor;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Repository;
import pers.xiaojun.boot.common.config.properties.OAuth2Properties;
import pers.xiaojun.boot.common.util.JsonUtils;
import pers.xiaojun.boot.module.system.constants.RedisKeyConstants;
import pers.xiaojun.boot.module.system.service.oauth2.dto.OAuth2CodeDTO;

import java.util.concurrent.TimeUnit;

/**
 * OAuth 2.0 授权码缓存
 *
 * @author xiaojun
 * @since 2025-10-18
 */
@Repository
@RequiredArgsConstructor
public class OAuth2CodeRedisDAO {

    private final RedisTemplate<String, Object> redisTemplate;
    private final OAuth2Properties oAuth2Properties;

    /**
     * 缓存oAuth2Code
     *
     * @param oAuth2Code 授权码信息
     */
    public void set(OAuth2CodeDTO oAuth2Code) {
        redisTemplate.opsForValue().set(
                StrUtil.format(RedisKeyConstants.OAuth2.SYSTEM_CODE, oAuth2Code.getCode()),
                JsonUtils.toJson(oAuth2Code),
                oAuth2Properties.getCodeExpiresIn(),
                TimeUnit.SECONDS
        );
    }

    public OAuth2CodeDTO get(String code) {
        Object redisData = redisTemplate.opsForValue().get(StrUtil.format(RedisKeyConstants.OAuth2.SYSTEM_CODE, code));
        return redisData == null ? null : JsonUtils.fromJson((String) redisData, OAuth2CodeDTO.class);
    }

    /**
     * 删除缓存中的授权码信息
     *
     * @param code 授权码
     */
    public boolean delete(String code) {
        return redisTemplate.delete(StrUtil.format(RedisKeyConstants.OAuth2.SYSTEM_CODE, code));
    }

}
